/*
 * EstrategiaIndice.h
 *
 * Esta clase es la interfas de todos los tipos de indices
 * La liberacion de los recurdos de los Key, inices queda por parte del usuario
 *
 *
 *  Created on: 13/10/2009
 *      Author: andres
 */
#ifndef ESTRATEGIAINDICE_H_
#define ESTRATEGIAINDICE_H_


#include "../../classes/PrimaryKey.h"
#include "../../classes/SecondaryKey.h"
#include "../../exceptions.inc.h"
#include <vector>

class EstrategiaIndice {

public:
	/**
	  * Constructor Indice Primario
	  *
	  * Crea un Indice primario a con el key indicado
	  * tira IndexException si la key es NULL
	  *
	  * @author andres
	  *
	  * @param PrymaryKey* primary key del dato a indexar
	  *
	  */
	EstrategiaIndice(PrimaryKey* primaryKey) throw(IndexException);

	/**
	  * Constructor Indice Secundario
	  *
	  * Crea un indice Secundario a partir del indice secundario dado
	  * tira IndexException si las key o el indice es NULL
	  *
	  * @author andres
	  *
	  * @param SecundaryKey* key que se utiliza en el indice
	  *
	  * @param PrimaryKey* key para buscar en el indice primario
	  *
	  * @param EstrategiaIndice* Indice primario en el cual buscar
	  *
	  */
	EstrategiaIndice(PrimaryKey* PrimaryKey, SecondaryKey* secondaryKey, EstrategiaIndice* indicePrimario) throw(IndexException);


	virtual ~EstrategiaIndice();

	/**
	  * Cargar
	  *
	  * Carga el dato en el indice
	  *
	  * En caso de inidce primario si el identificador esta repetido
	  * tira IndexException
	  *
	  * @author andres
	  *
	  * @param void* dato serializado a agregar en el indice
	  *
	  * @param int id en que esta guardado el dato
	  *
	  */
	virtual void Cargar(char* datoSerializadoACargar, unsigned int id) throw(IndexException)=0;
	
	/**
	  * Buscar
	  *
	  * Busca todos los datos indexados con la clave dada
	  *
	  * @author andres
	  *
	  * @param std::string clave que se busca en el indice
	  *
	  * @return std::vector<int> vector con los id de los resultados encontrados
	  *
	  */
	virtual std::vector<unsigned int> Buscar(std::string claveABuscar)=0;

	/**
	  * Listar
	  *
	  * Busca todos los datos contenidos entre las claves dadas
	  *
	  * @author andres
	  *
	  * @param claveInicial clave incial desde la que busca los datos
	  *
	  * @param claveFinal clave final hasta la que busca los datos
	  *
	  * @return std::vector<int> vector con todos los id de los datos encontrados
	  *
	  */


	/**
	  * Modificar
	  *
	  * cambia los datos en el indice
	  *
	  * @author andres
	  *
	  * @param DatoSerializadoSinModificar datos serializados sin modificar
	  *
	  * @param DatosSerializadoModificado datos serializados modificados
	  *
	  * @param idModificado id de los datos modificados
	  *
	  */
	virtual void Modificar(char* DatoSerializadoSinModificar, char* DatoSerializadoModificado, unsigned int idModificado)=0;
	
	/**
	 * Modificar
	 *
	 * cambia los datos en el indice
	 *
	 * @author Francisco
	 *
	 * @param DatoSerializadoSinModificar datos serializados sin modificar
	 *
	 * @param DatosSerializadoModificado datos serializados modificados
	 *
	 * @param unsigned int tamDatoSinModificar tamanio de dato antes de modificar
	 * 
	 * @param unsigned int tamDatoModificado tamanio de dato despues de modificar
	 *
	 */
	virtual void Modificar(char* DatoSerializadoSinModificar, char* DatoSerializadoModificado,
							unsigned int tamDatoSinModificar, unsigned int tamDatoModificado);

	/**
	  * Eliminar
	  *
	  * Elimina el dato del indice
	  *
	  * @author andres
	  *
	  * @param DatoSeralizadoAEliminar
	  *
	  */
	virtual void Eliminar(char* DatoSerializadoAEliminar)=0;


	/**
	  * EsIndicePrimario
	  *
	  * Indica si el indice es primario o no
	  *
	  * @author andres
	  *
	  * @return bool si el indice es primario devuelve true
	  *
	  */
	bool EsIndicePrimario();

	/**
	  * IndiceSecundarioDeParametro
	  *
	  * Indica si el indice secundario es del parametro dado
	  *
	  * @author andres
	  *
	  * @param std::string nombre del parametro indexado que se busca
	  *
	  * @return bool devuelve true si es parametro indexado en el indice el el buscado
	  *
	  */
	bool IndiceSecundarioDeParametro(std::string parametroBuscado);

protected:

	Key* GetKey();

	PrimaryKey* primaryKey;
	SecondaryKey* secondaryKey;
	EstrategiaIndice* indicePrimario;
};

#endif /* ESTRATEGIAINDICE_H_ */
